package com.qf.auth.service.impl;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.qf.auth.feign.CheckCodeFeign;
import com.qf.auth.feign.TenantFeign;
import com.qf.auth.service.TenantService;
import com.qf.common.bean.R;
import com.qf.common.dto.TenantDto;
import com.qf.common.model.QfTenant;
import com.qf.common.utils.IdWorker;
import com.qf.common.utils.JwtUtil;
import com.qf.common.utils.QfUtil;
import nonapi.io.github.classgraph.json.Id;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.UUID;

/**
 * @author 千锋健哥
 */
@Service
public class TenantServiceImpl implements TenantService {

    @Autowired
    private TenantFeign tenantFeign;

    @Autowired
    private CheckCodeFeign checkCodeFeign;

    @Override
    public R<Boolean> isexist(String name) {
        if (StringUtils.isEmpty(name)) {
            return R.ok(false);
        }
        TenantDto dto = new TenantDto();
        dto.setName(name);

        R<List<QfTenant>> result = tenantFeign.findTenantAll(dto);
        if (result != null) {
            if (result.getData() != null && result.getData().size() > 0) {
                return R.ok(false);
            }
        }
        return R.ok(true);
    }

    @Override
    public R<QfTenant> add(TenantDto dto) {
        //1. 根据手机号到redis中获取验证码
        R<String> codeResult = checkCodeFeign.getCode(dto.getPhone());
        if (codeResult == null) {
            return R.fail("验证码错误!");
        }
        if (StringUtils.isEmpty(codeResult.getMessage())) {
            return R.fail("验证码错误!");
        }
        //2. 校验验证码是否正确
        String redisCode = codeResult.getMessage();
        if (redisCode.equals(dto.getCode())) {
            //3. 验证码正确校验用户名是否重复
            R<Boolean> nameResult = isexist(dto.getName());
            if (nameResult.getData()) {
                //4. 用户不重复, 验证码也争取, 进行注册
                QfTenant tenant = new QfTenant();
                //将dto中的属性值全部set到实体类的属性值中
                dto.convertDtoToDo(tenant);

                //生成唯一ID
                IdWorker idWorker = new IdWorker();
                String id = String.valueOf(idWorker.nextId());
                //主键id
                tenant.setId(id);
                //自动生成的租户Key, 默认和id一样
                tenant.setAccessKey(id);
                //秘钥, 使用随机字符串生成
                tenant.setAccessSecurit(UUID.randomUUID().toString().replace("-",""));
                //审核状态,0待审核, 1通过, 2不通过
                tenant.setAuditStatus(0);
                //是否可用: 1可用, 2不可用
                tenant.setEnable(1);
                //租户密码, 使用md5加密
                tenant.setPwd(QfUtil.md5(tenant.getPwd()));
                //保存
                R<QfTenant> tenantResult = tenantFeign.add(tenant);
                return tenantResult;
            }
        }

        return R.fail("验证码错误");
    }

    @Override
    public R<String> login(TenantDto dto) {
        if (dto == null) {
            return R.fail("用户名和密码不能为空!");
        }
        if (dto.getName() == null || dto.getPwd() == null) {
            return R.fail("用户名和密码不能为空!");
        }

        //根据用户名到数据库查询租户
        TenantDto dtoParam = new TenantDto();
        dtoParam.setName(dto.getName());
        R<List<QfTenant>> tenantResult = tenantFeign.findTenantAll(dtoParam);
        //判断租户是否存在
        if (tenantResult.getCode() == R.Code.OK.getCode() && tenantResult.getData().size() > 0) {
            QfTenant tenant = tenantResult.getData().get(0);
            //校验密码
            String pwd = QfUtil.md5(dto.getPwd());
            if (pwd.equals(tenant.getPwd())) {
                //校验成功, 生成jwt返回
                String jwt = JwtUtil.createJWT(UUID.randomUUID().toString(), tenant.getId(), null);
                return R.ok(jwt);
            }
        }
        return R.fail("用户名密码错误!");
    }

}
